#!/bin/sh

# Copyright(c) 2011 OpenDomo Services SL. Licensed under GPL v3 or later

# Este script recibe un parámetro, indicando el nivel de ejecución que queremos 
# alcanzar, "init" para el arranque primario.
# 
# Valores de retorno de los scripts: 0-OK, 1-ERROR, 2-SKIPPED, 3-BACKGR
#
# Más información en http://es.opendomo.org/bootstart


RLVLFILE="/var/run/runlevel"
STDIR="/etc/opendomo/states"
ME=`whoami`

if ! test -d "$STDIR"; then
	mkdir -p $STDIR
	chown admin:admin $STDIR
	chmod 0770 $STDIR
fi

if test "$ME" == "root"; then
	chgrp admin $0
	chmod 0750 $0
	chown admin:users /var/run 2>/dev/null
	chmod g+w /var/run 2>/dev/null
fi

echo 
# Esta rutina muestra un texto descriptivo en función del valor de retorno
printres(){
	if test "$OUTPUT" != "CGI"; then
		echo -ne "\033[80D\033[72C"
		case $1 in
			0)
			echo -e "\033[32m[ OK  ] \033[0m"
			;;
			1)
			echo -e "\033[31m[ERROR] \033[0m"
			;;
			2)
			echo -e "\033[1;33m[SKIPD] \033[0m"
			;;
			3)
			echo -e "\033[1;33m[BACKG] \033[0m"
			;;
		esac
	else
		case $1 in
			0)
			echo -n "notice"
			;;
			1)
			echo -n "error"
			;;
			2)
			echo -n "warning"
			;;
			3)
			echo -n "background"
			;;
		esac	
	fi
}

#TODO Es necesario tener en cuenta los servicios que YA están en marcha 
# y no tratar de arrancarlos otra vez. Deberían ejecutarse con el 
# parámetro "reload", por si es necesario reconfigurarlos.

doseq(){
	if test "$1" = "boot"; then
		# Este es un caso especial
		STDIR="/etc/init.d"
		if test "$2" = "start"; then
			echo "Entering level [$1]:" 
			P="$STDIR/$1/S"
		else
			echo "Exiting level [$1]:"
			P="$STDIR/$1/K"
		fi
		for i in $P* ; do
			if test -f $i; then
				if test "$OUTPUT" == "CGI"; then
					BN=`basename $i`
					DESC=`grep '#desc' $i | cut -f2 -d:` 2>/dev/null
					echo -e "	$BN	$DESC	"
				fi
				if ! test -x "$i"; then 
					echo -n "Script not found `basename $i`" 
					printres 2
				else
					( 
					trap - INT QUIT TSTP;
					set $2
					. $i 
					)
					printres $?
				fi
			fi
		done
	else
		if test "$2" = "start"; then
			echo "Entering level [$1]:" 
		else
			echo "Exiting level [$1]:"
		fi
		if ! test -f /etc/opendomo/states/boot; then
			ln /etc/init.d/boot /etc/opendomo/states 2>/dev/null
		fi
		# Iniciando otro estado
		CURLVL="/etc/opendomo/states/`cat $RLVLFILE`"
		NEWLVL="/etc/opendomo/states/$1"
		for s in /etc/init.d/*; do
			BN=`basename $s`
			DESC=`grep '#desc' $s | head -n1 | cut -f2 -d:`
			if test -f "$CURLVL/$BN" && test -f "$NEWLVL/$BN"; then
				# Servicio activo en ambos estados: reload
				/etc/init.d/$BN reload
				printres $?
			elif test -f "$CURLVL/$BN" && ! test -f "$NEWLVL/$BN"; then
				# Servicio activo solo en el estado antiguo: stop
				/etc/init.d/$BN stop
				printres $?
				#echo "#INFO Service [$DESC] stopped"
			elif ! test -f "$CURLVL/$BN" && test -f "$NEWLVL/$BN"; then
				# Servicio solo existente en el nuevo estado: start
				/etc/init.d/$BN start
				printres $?
				#echo "#INFO Service [$DESC] started"
			#else
				#echo "# $s is not involved in $CURLVL or $NEWLVL"
			fi
		
		done
	fi
	if test "$2" = "start"; then
		echo "Level [$1] entered" 
		/bin/logevent notice system "Level [$1] entered"
		echo "$1" > $RLVLFILE
	else
		echo "Level [$1] exited" 
		/bin/logevent notice system "Level [$1] exited"
	fi
}

# Si existe un nivel de ejecucion previo, debemos cerrarlo 
#if test -f $RLVLFILE; then
#	LVL=`cat $RLVLFILE`
#	if test $LVL != "boot"; then
#		# Por supuesto, si el nivel previo es DISTINTO de "boot"
#		doseq $LVL stop
#	fi
#fi


# Arrancamos el nivel de ejecución indicado
case $1 in
	init)
		if test "$ME" != "root"; then
			echo "#ERR Missing privilege"
			exit 1
		else
			doseq boot start 2>/dev/null
			echo "boot" > $RLVLFILE
			chown admin:admin $RLVLFILE
			# Caso particular: después de terminar la secuencia de "boot"
			# miramos si hay algún estado por defecto al que cambiar.
			if test -f /mnt/odconf/laststate; then
				/usr/bin/logger -p notice "Last state configured"
				doseq `cat /mnt/odconf/laststate` start
			elif test -f /etc/opendomo/defstate.conf; then
				/usr/bin/logger -p notice "Default state configured"
				doseq `cat /etc/opendomo/defstate.conf` start
			fi
		fi
	;;
	shutdown)
		if test "$ME" != "root"; then
			echo "#ERR Missing privilege"
			exit 1
		else
			doseq boot stop 2>/dev/null
		fi
	;;
	# Cualquier otro caso debe corresponderse a un subdirectorio en $STDIR
	*)
		if test -d $STDIR/$1; then
			doseq $1 start 2>/dev/null
		else
			echo "#ERR Invalid state $1"
		fi
	;;
esac

#Reaplicamos permisos por si algún servicio los ha modificado
chown admin:users /var/run 2>/dev/null
chmod g+w /var/run 2>/dev/null
/bin/sh /etc/profile
